mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[dxbc] Implemented temporary register declarations
This commit is contained in:
parent
200da4cf60
commit
f5ad024f5d
@ -8,6 +8,13 @@ namespace dxvk {
|
|||||||
|
|
||||||
this->declareCapabilities();
|
this->declareCapabilities();
|
||||||
this->declareMemoryModel();
|
this->declareMemoryModel();
|
||||||
|
|
||||||
|
m_typeVoid = m_module.defVoidType();
|
||||||
|
m_typeFunction = m_module.defFunctionType(m_typeVoid, 0, nullptr);
|
||||||
|
|
||||||
|
m_module.functionBegin(m_typeVoid,
|
||||||
|
m_entryPointId, m_typeFunction,
|
||||||
|
spv::FunctionControlMaskNone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -20,12 +27,16 @@ namespace dxvk {
|
|||||||
const DxbcOpcodeToken token = ins.token();
|
const DxbcOpcodeToken token = ins.token();
|
||||||
|
|
||||||
switch (token.opcode()) {
|
switch (token.opcode()) {
|
||||||
|
case DxbcOpcode::DclTemps: {
|
||||||
|
this->dclTemps(ins.arg(0));
|
||||||
|
} return true;
|
||||||
|
|
||||||
case DxbcOpcode::DclThreadGroup: {
|
case DxbcOpcode::DclThreadGroup: {
|
||||||
m_module.setLocalSize(
|
m_module.setLocalSize(
|
||||||
m_entryPointId,
|
m_entryPointId,
|
||||||
ins.getArgWord(0),
|
ins.arg(0),
|
||||||
ins.getArgWord(1),
|
ins.arg(1),
|
||||||
ins.getArgWord(2));
|
ins.arg(2));
|
||||||
} return true;
|
} return true;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -37,6 +48,8 @@ namespace dxvk {
|
|||||||
|
|
||||||
|
|
||||||
Rc<DxvkShader> DxbcCompiler::finalize() {
|
Rc<DxvkShader> DxbcCompiler::finalize() {
|
||||||
|
m_module.functionEnd();
|
||||||
|
|
||||||
return new DxvkShader(m_version.shaderStage(),
|
return new DxvkShader(m_version.shaderStage(),
|
||||||
m_module.compile(), 0, nullptr);
|
m_module.compile(), 0, nullptr);
|
||||||
}
|
}
|
||||||
@ -67,4 +80,22 @@ namespace dxvk {
|
|||||||
spv::MemoryModelGLSL450);
|
spv::MemoryModelGLSL450);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DxbcCompiler::dclTemps(uint32_t n) {
|
||||||
|
// Temporaries are treated as untyped 4x32-bit vectors.
|
||||||
|
uint32_t u32Type = m_module.defIntType(32, 0);
|
||||||
|
uint32_t regType = m_module.defVectorType(u32Type, 4);
|
||||||
|
uint32_t ptrType = m_module.defPointerType(regType, spv::StorageClassPrivate);
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < n; i++) {
|
||||||
|
DxbcRegTypeR reg;
|
||||||
|
reg.varType = regType;
|
||||||
|
reg.ptrType = ptrType;
|
||||||
|
reg.varId = m_module.newVar(ptrType, spv::StorageClassPrivate);
|
||||||
|
m_rRegs.push_back(reg);
|
||||||
|
|
||||||
|
m_module.setDebugName(reg.varId,
|
||||||
|
str::format("r", i).c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -6,6 +6,12 @@
|
|||||||
|
|
||||||
namespace dxvk {
|
namespace dxvk {
|
||||||
|
|
||||||
|
struct DxbcRegTypeR {
|
||||||
|
uint32_t varType;
|
||||||
|
uint32_t ptrType;
|
||||||
|
uint32_t varId;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief DXBC to SPIR-V compiler
|
* \brief DXBC to SPIR-V compiler
|
||||||
*
|
*
|
||||||
@ -43,11 +49,18 @@ namespace dxvk {
|
|||||||
DxbcProgramVersion m_version;
|
DxbcProgramVersion m_version;
|
||||||
SpirvModule m_module;
|
SpirvModule m_module;
|
||||||
|
|
||||||
|
std::vector<DxbcRegTypeR> m_rRegs;
|
||||||
|
|
||||||
uint32_t m_entryPointId = 0;
|
uint32_t m_entryPointId = 0;
|
||||||
|
|
||||||
|
uint32_t m_typeVoid = 0;
|
||||||
|
uint32_t m_typeFunction = 0;
|
||||||
|
|
||||||
void declareCapabilities();
|
void declareCapabilities();
|
||||||
void declareMemoryModel();
|
void declareMemoryModel();
|
||||||
|
|
||||||
|
void dclTemps(uint32_t n);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
@ -415,7 +415,7 @@ namespace dxvk {
|
|||||||
* \param [in] idx Argument word index
|
* \param [in] idx Argument word index
|
||||||
* \returns The word at the given index
|
* \returns The word at the given index
|
||||||
*/
|
*/
|
||||||
uint32_t getArgWord(uint32_t idx) const {
|
uint32_t arg(uint32_t idx) const {
|
||||||
return m_args.getWord(idx);
|
return m_args.getWord(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,7 +425,7 @@ namespace dxvk {
|
|||||||
* \param [in] idx Argument word index
|
* \param [in] idx Argument word index
|
||||||
* \returns The operand object
|
* \returns The operand object
|
||||||
*/
|
*/
|
||||||
DxbcOperand getOperand(uint32_t idx) const {
|
DxbcOperand operand(uint32_t idx) const {
|
||||||
return DxbcOperand(m_args + idx);
|
return DxbcOperand(m_args + idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,7 +55,9 @@ namespace dxvk {
|
|||||||
void SpirvModule::setMemoryModel(
|
void SpirvModule::setMemoryModel(
|
||||||
spv::AddressingModel addressModel,
|
spv::AddressingModel addressModel,
|
||||||
spv::MemoryModel memoryModel) {
|
spv::MemoryModel memoryModel) {
|
||||||
|
m_memoryModel.putIns (spv::OpMemoryModel, 3);
|
||||||
|
m_memoryModel.putWord (addressModel);
|
||||||
|
m_memoryModel.putWord (memoryModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -77,7 +79,9 @@ namespace dxvk {
|
|||||||
void SpirvModule::setDebugName(
|
void SpirvModule::setDebugName(
|
||||||
uint32_t expressionId,
|
uint32_t expressionId,
|
||||||
const char* debugName) {
|
const char* debugName) {
|
||||||
|
m_debugNames.putIns (spv::OpName, 2 + m_debugNames.strLen(debugName));
|
||||||
|
m_debugNames.putWord(expressionId);
|
||||||
|
m_debugNames.putStr (debugName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -286,8 +290,8 @@ namespace dxvk {
|
|||||||
uint32_t variableType,
|
uint32_t variableType,
|
||||||
spv::StorageClass storageClass) {
|
spv::StorageClass storageClass) {
|
||||||
std::array<uint32_t, 2> args = {
|
std::array<uint32_t, 2> args = {
|
||||||
variableType,
|
|
||||||
storageClass,
|
storageClass,
|
||||||
|
variableType,
|
||||||
};
|
};
|
||||||
|
|
||||||
return this->defType(spv::OpTypePointer,
|
return this->defType(spv::OpTypePointer,
|
||||||
@ -295,6 +299,19 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t SpirvModule::newVar(
|
||||||
|
uint32_t pointerType,
|
||||||
|
spv::StorageClass storageClass) {
|
||||||
|
uint32_t resultId = this->allocateId();
|
||||||
|
|
||||||
|
m_variables.putIns (spv::OpVariable, 4);
|
||||||
|
m_variables.putWord (pointerType);
|
||||||
|
m_variables.putWord (resultId);
|
||||||
|
m_variables.putWord (storageClass);
|
||||||
|
return resultId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void SpirvModule::functionBegin(
|
void SpirvModule::functionBegin(
|
||||||
uint32_t returnType,
|
uint32_t returnType,
|
||||||
uint32_t functionId,
|
uint32_t functionId,
|
||||||
|
@ -115,6 +115,10 @@ namespace dxvk {
|
|||||||
uint32_t variableType,
|
uint32_t variableType,
|
||||||
spv::StorageClass storageClass);
|
spv::StorageClass storageClass);
|
||||||
|
|
||||||
|
uint32_t newVar(
|
||||||
|
uint32_t pointerType,
|
||||||
|
spv::StorageClass storageClass);
|
||||||
|
|
||||||
void functionBegin(
|
void functionBegin(
|
||||||
uint32_t returnType,
|
uint32_t returnType,
|
||||||
uint32_t functionId,
|
uint32_t functionId,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user